package com.boot.unity.api.wx.service;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.boot.unity.api.entity.Result;
import com.boot.unity.api.entity.StuSyncDTO;
import com.boot.unity.api.entity.Student;
import com.boot.unity.api.utils.DateUtil;
import com.boot.unity.api.utils.IdentityTypeEnum;
import com.boot.unity.api.wx.entity.Dept;
import com.boot.unity.api.wx.entity.Stu;
import com.boot.unity.api.wx.entity.StuSyncDTOwhZh;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import okhttp3.*;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Base64;
import java.util.List;


/**
 * StudentSyncService  推送计时数据
 */
@Service
@RequiredArgsConstructor
public class StudentSyncService {
    private final ObjectMapper objectMapper;
    private final RestTemplate restTemplate;

    @Value("${img.filePath}")
    private String filePath;


    private static final String appSecret = "123456";

    public int studentSync(Stu stu,Student student,String schoolNumber) {
        if(stu.getSchoolId().equals("3340")){
            System.out.println("----------------------推送多伦的计时---------------------------------");
            return this.sendDl(stu,student);
        }else{
            System.out.println("----------------------推送中寰的计时---------------------------------");
            return this.sendZh(stu,student,schoolNumber);
//            return 1;
        }
    }

    //中寰计时平台
    public int sendZh(Stu stu,Student student,String schoolNumber){
        System.out.println("-----------中寰计时平台中寰计时平台中寰计时平台中寰计时平台中寰计时平台中寰计时平台中寰计时平台--------------------------");
//        Student student = studentDao.getByCarNo(cardNo);
//        Stu stu = stuDao.getByCardNo(cardNo,student.getTrainType());

//        Stu stu = stuDao.getStuByCardNo(cardNo);
//        Student student = studentDao.getByStudentId(stu.getStudentId());

        student.setName(trimStr(student.getName()));
        stu.setName(trimStr(stu.getName()));
        //获取驾校是否有充足的学员推送数量名额
        Long studentid = student.getId();
//        Dept dept = deptDao.queryEntityById(Integer.parseInt(stu.getSchoolId()));

        if ((stu != null) && (student != null) && (StringUtils.isNotBlank(student.getPhotoPath()))) {
            StuSyncDTOwhZh stuSyncDTO = new StuSyncDTOwhZh();

            stuSyncDTO.setStudyState(1);
            stuSyncDTO.setName(stu.getName());               // 学员姓名
            stuSyncDTO.setCardNo(stu.getCardNo());          // 证件号
            stuSyncDTO.setInscode(schoolNumber);
            if(StringUtils.isEmpty(student.getNationality())){
                stuSyncDTO.setNationality("中国");
            }else{
                stuSyncDTO.setNationality(student.getNationality());
            }
            stuSyncDTO.setVehicleType(stu.getTrainType());     // 培训车型（如：C1、C2、B1等）
            if(StringUtils.isEmpty(stu.getSignupDate())){
                stuSyncDTO.setSignUpdate(DateUtil.getNormalDateString().replace("-",""));    // 报名日期（yyyyMMdd）
            }else{
                stuSyncDTO.setSignUpdate(stu.getSignupDate().replace("-",""));    // 报名日期（yyyyMMdd）
            }
//            stuSyncDTO.setSignUpdate(stu.getSignupDate()+" 09:02:03");    // 报名日期（yyyyMMdd）
            stuSyncDTO.setPerdritype(null);                  // 原准驾车型 （如：C1、C2、B1等）
            stuSyncDTO.setPreVehicleCardNo(null);   //原驾驶证号
            stuSyncDTO.setCardFirstDate(null);
            if(StringUtils.isEmpty(stu.getMobile())){
                stuSyncDTO.setTelephone(student.getMobile());            // 手机号
            }else{
                stuSyncDTO.setTelephone(stu.getMobile());            // 手机号
            }
            if(StringUtils.isEmpty(stu.getGender())){
                stuSyncDTO.setSex(student.getGender()+"");              // 性别（1：男，2：女）
            }else{
                stuSyncDTO.setSex(stu.getGender());              // 性别（1：男，2：女）
            }
            stuSyncDTO.setCardNo(stuSyncDTO.getCardNo().toUpperCase());
            stuSyncDTO.setStunum(null);
            if(StringUtils.isEmpty(stu.getAddress())){
                stuSyncDTO.setAddress(student.getAddress());         // 联系地址
            }else{
                stuSyncDTO.setAddress(stu.getAddress());         // 联系地址
            }

            String cardType;
            String cardTypeTemp = stu.getCardType();
            if (IdentityTypeEnum.A.getCardType().equals(cardTypeTemp)) {
                cardType = "1";
            } else if (IdentityTypeEnum.C.getCardType().equals(cardTypeTemp)) {
                cardType = "3";
            } else {
                cardType = "4";
            }

            String busitype;
            String busitypeTemp = student.getLearningCategories();
            if ("初学".equals(busitypeTemp)) {
                busitype = "0";
            } else if ("增驾".equals(busitypeTemp)) {
                busitype = "1";
            } else if ("货运初领".equals(busitypeTemp)) {
                busitype = "11";
            } else if ("货运增领".equals(busitypeTemp)) {
                busitype = "12";
            }else{
                busitype = "9";
            }
            stuSyncDTO.setBusitype(busitype); // 业务类型（0：初领，1：增领）
            //1:保存同时生成国交表数据 ， 0：保存不生成国交表数据
            stuSyncDTO.setIsCreateGJ("1");//是否生成国交数据
            stuSyncDTO.setBrith(stu.getBirth());             // 出生日期 （yyyy-MM-dd）
            String base64Photo;
            //进行获取上传的图片的数据
            /*List<JSONObject> blist = stuDao.queryBaseImgForCardId(student.getCardNo());
            if(blist.size() > 0){
                base64Photo = blist.get(0).getString("file");
            }else{
                String photoPath = "D:/train/photo.jpg";
                if(!StringUtils.isEmpty(student.getPhotoPath())){
                    photoPath = student.getPhotoPath();
                }
                try {
                    InputStream is = new FileInputStream(new File(photoPath));
                    byte[] bytes = new byte[is.available()];
                    is.read(bytes);
                    base64Photo = Base64.getEncoder().encodeToString(bytes);
                } catch (IOException e) {
                    log.error("图片编码异常,图片路径:{},异常{}", photoPath, e.getMessage());
                    return;
                }
            }*/
            String photoPath = filePath+"photo.jpg";
            /*if(!StringUtils.isEmpty(student.getPhotoPath())){
                photoPath = student.getPhotoPath();
            }*/
            try {
                InputStream is = new FileInputStream(new File(photoPath));
                byte[] bytes = new byte[is.available()];
                is.read(bytes);
                base64Photo = Base64.getEncoder().encodeToString(bytes);
            } catch (IOException e) {
                System.out.println("图片编码异常,图片路径:{},异常{}"+photoPath+e.getMessage());
                return 0;
            }
//            System.out.println("中寰图像处理："+base64Photo);
            stuSyncDTO.setHeadPhoto(base64Photo);                           // 报名照片Base64编码


            stuSyncDTO.setDataSource("100");
            stuSyncDTO.setEntityState("2");
            stuSyncDTO.setStunum(null);
            // 时间戳
            Long ts = System.currentTimeMillis();
            /*if (log.isDebugEnabled()) {
                log.debug("ts:{}", ts);
            }*/

            // hash字符串
            String sign = DigestUtils.sha256Hex(ts + appSecret + stu.getCardNo());
            /*if (log.isDebugEnabled()) {
                log.debug("sign{}", sign);
            }*/
            JSONObject stuJson = (JSONObject) JSONObject.parse(JSON.toJSONString(stuSyncDTO));
            if ("初学".equals(busitypeTemp)) {
                stuJson.put("perdritype",null);
                stuJson.put("cardFirstDate",null);
                stuJson.put("preVehicleCardNo",null);
            } else {
                if(stu.getIsPlusCard() == null){
                    stu.setIsPlusCard("0");
                }
                if(stu.getIsPlusCard().trim().equals("1")){
                    if(stu.getLaterType() == null){
                        System.out.println("ts:{}"+"没有选择上级类型");}
                    if(stu.getFirstDate() == null){System.out.println("ts:{}"+"没有选择初领日期");}
                    stuSyncDTO.setPerdritype(stu.getLaterType());                  // 原准驾车型 （如：C1、C2、B1等）
                    stuSyncDTO.setPreVehicleCardNo(stu.getCardNo());   //原驾驶证号
                    stuSyncDTO.setCardFirstDate(stu.getFirstDate());               // 驾驶证初领日期（yyyy-MM-dd）
                }else{
                    System.out.println("ts:{}"+"没有选择是否增驾");
                }
            }

            if(!StringUtils.isEmpty(stuSyncDTO.getHeadPhoto())){
                JSONObject newJSON = stuJson;
                newJSON.remove("headPhoto");
                System.out.println("推送学员信息:{}"+newJSON.toString());
            }
            OkHttpClient client = new OkHttpClient().newBuilder().build();
//            okhttp3.MediaType mediaType = okhttp3.MediaType.parse("text/plain");
            RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
                    .addFormDataPart("strParms",stuJson.toString()).build();
            Request request = new Request.Builder().url("http://36.133.121.106:8085/File/AddStudent")
                    .method("POST", body).build();
            if(!StringUtils.isEmpty(stuSyncDTO.getHeadPhoto())){
                System.out.println("传输的图片有数据，对图片数据进行清空！");
                stuSyncDTO.setHeadPhoto("");
            }
            JSONObject json = null;
            try {
                Response response = client.newCall(request).execute();
                json = (JSONObject) JSONObject.parse(response.body().string());
                System.out.println("中寰推送结果：：：："+json.toString());
                if(!StringUtils.isEmpty(json.getString("Code"))){
                    System.out.println("code:::::"+json.getString("Code"));
                    String code = json.getString("Code");
                    if(code.trim().equals("1")){
                        return 1;
                    }
                }

            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        return 0;
    }


    //https://mainrest.duolunxc.com/services/common/studentInfoSync/{}/{}
    //威海鲁东驾校
    //多轮计时平台
    public int sendDl(Stu stu,Student student){
        String cardNo = stu.getCardNo();
        System.out.println("学员基本信息："+ JSON.toJSONString(stu));

        student.setName(trimStr(student.getName()));
        stu.setName(trimStr(stu.getName()));

        //获取驾校是否有充足的学员推送数量名额
        Long studentid = student.getId();
        if ((stu != null) && (student != null) && (StringUtils.isNotBlank(student.getPhotoPath()))) {
            StuSyncDTO stuSyncDTO = new StuSyncDTO();
            stuSyncDTO.setLearnStatus("1"); //还是之前的接口加了个入参，学员状态（1、报名，2、退费(退学)）learnStatus
            stuSyncDTO.setName(stu.getName());               // 学员姓名
            stuSyncDTO.setCardnum(stu.getCardNo());          // 证件号

            String cardType;
            String cardTypeTemp = stu.getCardType();
            if (IdentityTypeEnum.A.getCardType().equals(cardTypeTemp)) {
                cardType = "1";
            } else if (IdentityTypeEnum.C.getCardType().equals(cardTypeTemp)) {
                cardType = "3";
            } else {
                cardType = "4";
            }
            stuSyncDTO.setCardnum(stuSyncDTO.getCardnum().toUpperCase());
            stuSyncDTO.setCardtype(cardType);                // 证件类型（1：身份证，2：护照，3：军官证，4：其他）
            if(stu.getGender() == null || stu.getGender().trim().equals("")){
                stuSyncDTO.setSex(student.getGender()+"");              // 性别（1：男，2：女）
            }else{
                stuSyncDTO.setSex(stu.getGender());              // 性别（1：男，2：女）
            }

            stuSyncDTO.setCompanyId(stu.getSchoolName());    // 驾校全称（要和计时平台驾校名称一致）
            stuSyncDTO.setBrith(stu.getBirth());             // 出生日期 （yyyy-MM-dd）

            String busitype;
            String busitypeTemp = student.getLearningCategories();
            if ("初学".equals(busitypeTemp)) {
                busitype = "0";
            } else if ("增驾".equals(busitypeTemp)) {
                busitype = "1";
            } else if ("货运初领".equals(busitypeTemp)) {
                busitype = "11";
            } else if ("货运增领".equals(busitypeTemp)) {
                busitype = "12";
            }else{
                busitype = "9";
            }
            stuSyncDTO.setBusitype(busitype); // 业务类型（0：初领，1：增领）

            stuSyncDTO.setTraintype(stu.getTrainType());     // 培训车型（如：C1、C2、B1等）
            if(stu.getMobile() == null  || stu.getMobile().trim().equals("")){
                stuSyncDTO.setPhone(student.getMobile());            // 手机号
            }else{
                stuSyncDTO.setPhone(stu.getMobile());            // 手机号
            }
            if(stu.getAddress() == null  || stu.getAddress().trim().equals("")){
                stuSyncDTO.setAddress(student.getAddress());         // 联系地址
            }else{
                stuSyncDTO.setAddress(stu.getAddress());         // 联系地址
            }


            String base64Photo;
            //进行获取上传的图片的数据
            /*List<JSONObject> blist = stuDao.queryBaseImgForCardId(student.getCardNo());
            if(blist.size() > 0){
                base64Photo = blist.get(0).getString("file");
            }else{

            }*/

            String photoPath = filePath+"photo.jpg";
            /*if(!StringUtils.isEmpty(student.getPhotoPath())){
                photoPath = student.getPhotoPath();
            }*/
            try {
                InputStream is = new FileInputStream(new File(photoPath));
                byte[] bytes = new byte[is.available()];
                is.read(bytes);
                base64Photo = Base64.getEncoder().encodeToString(bytes);
            } catch (IOException e) {
                System.out.println("图片编码异常,图片路径:{},异常{}"+photoPath+e.getMessage());
                return 0;
            }

            stuSyncDTO.setPhoto(base64Photo);                           // 报名照片Base64编码
            stuSyncDTO.setApplydate(stu.getSignupDate());    // 报名日期（yyyy-MM-dd）
            stuSyncDTO.setApplyType("1");                    // 报名方式（1一次性缴费 2先学后付 3-分期付款 ）

            if ("初学".equals(busitypeTemp)) {
                stuSyncDTO.setPerdritype("");                  // 原准驾车型 （如：C1、C2、B1等）
                stuSyncDTO.setDrilicnum("");   // 原驾驶证号
                stuSyncDTO.setFstdrilicdate("");               // 驾驶证初领日期（yyyy-MM-dd）
            } else {
                if(stu.getIsPlusCard() == null){
                    stu.setIsPlusCard("0");
                }
                if(stu.getIsPlusCard().trim().equals("1")){
                    if(stu.getLaterType() == null){System.out.println("ts:{}"+"没有选择上级类型");}
                    if(stu.getFirstDate() == null){System.out.println("ts:{}"+"没有选择初领日期");}
                    stuSyncDTO.setPerdritype(stu.getLaterType());                  // 原准驾车型 （如：C1、C2、B1等）
                    stuSyncDTO.setDrilicnum(cardNo);   //原驾驶证号
                    stuSyncDTO.setFstdrilicdate(stu.getFirstDate());               // 驾驶证初领日期（yyyy-MM-dd）
                }else{
                    System.out.println("ts:{}"+"没有选择是否增驾");
                }

            }
            stuSyncDTO.setReferrer("无");                    // 推荐人

            // 时间戳
            Long ts = System.currentTimeMillis();

            // hash字符串
            String sign = DigestUtils.sha256Hex(ts + appSecret + cardNo);

            String invokeUrl2 = "https://mainrest.duolunxc.com/services/common/studentInfoSync/" + ts + "/" + sign;
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            try {
                HttpEntity httpEntity = new HttpEntity(objectMapper.writeValueAsString(stuSyncDTO), headers);
                ResponseEntity<Result> entity = restTemplate.postForEntity(invokeUrl2, httpEntity, Result.class);
//                System.out.println("entity的反馈结果："+entity.getBody().toString());
//                System.out.println("entity的反馈结果2："+entity.toString());
                System.out.println(student.getName()+":"+entity.getStatusCode().is2xxSuccessful());
                if (entity.getStatusCode().is2xxSuccessful()){
                    if(!StringUtils.isEmpty(stuSyncDTO.getPhoto())){
                        System.out.println("传输的图片有数据，对图片数据进行清空！");
                        stuSyncDTO.setPhoto("");
                    }
                    Result result = entity.getBody();
                    System.out.println("result.getErrorcode()::::::"+result.getErrorcode());
                    if (result.getErrorcode() == 0) {
                        return 1;
                    } else {
                        System.out.println("3"+student.getId()+""+ result.toString());
                        return 0;
                    }
                }else {
                    System.out.println("2");
                    return 0;
                    // System.out.println("调用{}失败,body:{},response:{}"+invokeUrl2+JSON.toJSONString(stuSyncDTO));
                }
            }catch (Exception e){
                System.out.println("1");
                //e.printStackTrace();
                System.out.println("调用{}异常,body:{},exception"+invokeUrl2+JSON.toJSONString(stuSyncDTO)+e.getMessage());
            }
            return 0;
        }
        return 0;
    }


    public String trimStr(String str){
        String s = str.replaceAll("[\\pP\\pS\\pZ]", "");
        return s;
    }

}
